package model;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;

/**
 * Clase GestorDeContenidos
 * @author Grupo-03
 * @version 0.1, 08/04/14 
 *
 */
public class GestorDeContenidos {

	private long 						id;
	private Usuario 				  usuario;
	private Catalogo 				  catalogo;
	private Collection <Reproduccion> reproducciones;
	
	// Constructor
	public GestorDeContenidos(Usuario usuario, Catalogo catalogo){
		this.reproducciones = new ArrayList<Reproduccion>();
		this.usuario = usuario;
		this.catalogo = catalogo;
	}
	
	public GestorDeContenidos(){
	}
	
	public Catalogo getCatalogo(){
		return this.catalogo;
	}
	
	public void setCatalogo(Catalogo cat){
		this.catalogo = cat;
	}
	
	public Usuario getUsuario(){
		return this.usuario;
	}
	
	public void setUsuario(Usuario usu){
		this.usuario = usu;
	}
	
	public Collection<Reproduccion> getReproducciones(){
		return this.reproducciones;
	}
	
	public void setReproducciones(Collection<Reproduccion>repro){
		this.reproducciones = repro;
	}
	
	// Other Methods
	public boolean puedeReproducir(Reproducible reproducible){
		/**@return Retorna verdadero si se puede reproducir el 
		 * @param reproducible 
		 *con la edad del usuario y el limit de su suscription 
		 */
		return (this.usuario.edad() >= reproducible.getEdadMinima() && 
				this.usuario.getSuscripcion().limiteDeReproducciones() > this.cantidadDeReproducciones());
	}
	
	public void registrarReproduccion(Reproducible reproducible, Date fecha, long tiempo){
		// Registra una nueva reproduction con los param
		if ((this.usuario.edad() >= reproducible.getEdadMinima()) && (this.cantidadDeReproducciones()<this.usuario.getSuscripcion().limiteDeReproducciones())) {
			Reproduccion repro = new Reproduccion(reproducible,fecha, tiempo);
			this.reproducciones.add(repro);
		}
	}
	
	public Collection<Pelicula> peliculasAptas(){
		/**@return Retorna los films que puede ver el usuario del gestor
		 * 
		 */
		ArrayList<Pelicula>  pelis = new ArrayList<Pelicula>();
		//HashSet <Contenido> conts = (HashSet<Contenido>) this.catalogo.getContenidos();
		//Iterator <Contenido>  iter = conts.iterator();
		Iterator <Contenido>  iter = this.catalogo.getContenidos().iterator();
		while (iter.hasNext()){
			Contenido contenido = iter.next();
			if (contenido.esPelicula() && (this.usuario.edad() >= contenido.getEdadMinima()))
				pelis.add((Pelicula) contenido);
		}
		return pelis;
	}
	
	public Collection<Episodio> episodiosSinVerDe(Temporada temporada){
		/**
		 * @return Retorna los episodios sin ver de la @param temporada 
		 */
		// Retorna los episodios sin ver de la temporada pasada como param
		
		// Todos los episodios de la temporada pasada como parametro son:
		//ArrayList <Episodio> episodiosTodos = (ArrayList <Episodio>) temporada.getEpisodios();
		
		// Recorro la coleccion de los vistos y borro los episodio de episodiosTodos
		// me van a quedar los que me faltan ver
		Iterator<Reproduccion> iter = this.reproducciones.iterator();
		while (iter.hasNext()){
			Reproducible reproducible = iter.next().getReproducible();
			if (reproducible.esEpisodio()){
				//episodiosTodos.remove((Episodio)reproducible);
				temporada.getEpisodios().remove(reproducible);
				
			}
		}
		//return episodiosTodos;
		return temporada.getEpisodios();
	}
	
	public Collection<Pelicula> peliculasVistas(){
		/** @return Devuelve todas las peliculas vistas (reproducidas)
		*/
		ArrayList <Pelicula> peliculasVistas = new ArrayList <Pelicula>();
		Iterator <Reproduccion> iter = this.reproducciones.iterator();
		while (iter.hasNext()){
			Reproducible repro = iter.next().getReproducible();
			if (repro.esPelicula())
				peliculasVistas.add((Pelicula) repro);
		}
		return peliculasVistas;
	}
	
	public Collection<Episodio> episodiosVistos(){
		/** @return Devuelve todos los episodios vistos (reproducidos)
		*/
		ArrayList <Episodio> episodiosVistos = new ArrayList<Episodio>();
		Iterator<Reproduccion> iter = this.reproducciones.iterator();
		while (iter.hasNext()){
			Reproducible repro = iter.next().getReproducible();
			if (repro.esEpisodio())
				episodiosVistos.add((Episodio)repro);
		}
		return episodiosVistos;
	}
	
	private int cantidadDeReproducciones(){
		/** @return Devuelve la cantidad de reproducciones vistas.
		*/
		return this.reproducciones.size();
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}
}
